package com.caocaog.market.finance.timetask;


import com.caocaog.market.constant.MarketConstant;
import com.caocaog.market.finance.calculation.Calculate;
import com.caocaog.market.finance.entity.MkBillBase;
import com.caocaog.market.finance.entity.MkBillLineHistory;
import com.caocaog.market.finance.service.MkBillBaseService;
import com.caocaog.market.finance.service.MkBillLineHistoryService;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.IPUtils;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

/**
 * @author liguang
 * @version 1.0.0
 * @Project jeecg-boot
 * @Package com.caocaog.market.finance.timetask
 * @ClassName CalculationTimeTask.java
 * @createTime 2021年12月07日 15:52:00
 * @Description 定时结算任务
 */
@Deprecated
@Slf4j
@Component
@EnableScheduling
public class CalculationTimeTaskSys {

    @Autowired
    private MkBillBaseService billBaseService;
    @Autowired
    private MkBillLineHistoryService billLineHistoryService;

    // @Scheduled(cron = "0 17 4 * * ?")
    @Scheduled(cron = "1 0 0 * * ?")
    public void execute() throws JobExecutionException {

        /**
         *  结算天数（settlement_time字段，单位是天）、总部的抽成比例（sys_rake_rate字段/100）是从mk_site_basic中取的；
         *  分站抽成  是从mk_shop_basic中取的 commission_rate  字段
         *      1、查询出所有待结算的账单根据系统给每个分站设置的结算天数判断该账单是否可以进行结算
         *          1.1 查询出所有待结算的账单
         *          1.2 看这些待结算的账单属于哪个分站  查询出该分站的待结算时间以及抽成比例
         *          1.3 进入第2步进行计算
         *
         *      2、根据每个订单所属的商家、分站（抽成比例）  以及   系统(抽成比例)  来进行分成计算
         *
         *      3、每个单子的抽成比例、金额算好之后 存入mk_bill_line 以及  mk_bill_history表中
         */
         String localPort = String.valueOf(IPUtils.getTomcatPort());
        // 定时结算任务由指定的端口号来执行（目前是由端口为9093的tomcat来承担）
        if(localPort.equals(MarketConstant.SCHEDULED_PORT)){
            log.info("-------------------执行结算  开始时间："+new Date()+"--------------");
            try {
                MkBillBase billBase = new MkBillBase();
                // 查询待结算的账单信息
                billBase.setPayStatus(MarketConstant.FINANCE_PAY_STATUS_DJS);
                List<MkBillBase> billList = billBaseService.findAllForNoPage(billBase);
                log.info("billBaseService-执行没有-->  " + billBaseService);
                log.info("billLineHistoryService-执行没有-->  " + billLineHistoryService);
                log.info("总共有多少条待结算的数据记录：：：：：" + billList.size());

                log.info(String.format("CalculationTimeTaskSys---   执行没有：" + DateUtils.getTimestamp()));
                if (null == billList || billList.size() < 1) {
                    log.info("没有需要执行结算的数据----》  直接返回");
                    return;
                }

                /**
                 * 调用结算方法进行结算
                 */
                List<MkBillLineHistory> lines = Calculate.compute(billList);
                /**
                 * 存订单行以及订单行历史,
                 * 以及更改符合结算条件的账单信息
                 * */
                List<MkBillBase> settlementBaseList = Calculate.getSettlementBaseList();
                log.info("符合结算条件的条数：  " + settlementBaseList.size());
                if (settlementBaseList.size() < 1) {
                    // 没有符合结算条件的数据
                    return;
                }
                int count = billLineHistoryService.insertBillLineAndHistory(settlementBaseList, lines);
                log.info("执行结果 :---成功了吗?   " + count);
                if (count > 0) {
                    log.info("本次结算任务执行成功！");
                } else {
                    log.info("本次结算任务执行失败！");
                    throw new JeecgBootException("本次结算任务执行失败");
                }
                log.info("-------------------执行结算  结束时间：" + new Date() + "--------------");
                log.info("结算任务执行成功！");
            }catch (Exception e){
                log.error("结算任务执行失败");
                log.error(e.getMessage());
                e.printStackTrace();
            }
        }
    }

    public void execute2(){
//        for(int i=0;i<10;i++){
//            log.info("我是测试定时任务，我执行了！");
//        }
        log.info("不执行结算定时任务~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    }
}
